DROP FUNCTION proc_producto_actualiza(sdescorta_ character varying, sdeslarga_ character varying, nprecio_ double precision, nestado_ integer, ncategoria_ integer, scodbarra_ character varying, simagen_ character varying, ndestino_ integer, ntipo_ integer, ncodigo_ integer);
CREATE OR REPLACE FUNCTION proc_producto_actualiza(sdescorta_ character varying, sdeslarga_ character varying, nprecio_ double precision, nestado_ integer, ncategoria_ integer, scodbarra_ character varying, simagen_ character varying, ndestino_ integer, ntipo_ integer, nalmdescarga_ integer, ncodigo_ integer)
  RETURNS integer AS
$BODY$


DECLARE
	
BEGIN
	
	UPDATE producto set sdescorta=sdescorta_ , sdeslarga =sdeslarga_ , ncategoria=ncategoria_ , nestado=nestado_ , nprecio=nprecio_ , scodbarra= scodbarra_ , simagen= simagen_ , ncodigodestino=ndestino_ , ntipo=ntipo_ , nalmdescarga=nalmdescarga_
	WHERE ncodigo=ncodigo_;

	RETURN 1;
END;

$BODY$
  LANGUAGE 'plpgsql' VOLATILE;



DROP FUNCTION proc_producto_inserta(sdescorta_ character varying, sdeslarga_ character varying, nprecio_ double precision, nestado_ integer, ncategoria_ integer, scodbarra_ character varying, ndestino_ integer, simagen_ character varying, ntipo_ integer);
CREATE OR REPLACE FUNCTION proc_producto_inserta(sdescorta_ character varying, sdeslarga_ character varying, nprecio_ double precision, nestado_ integer, ncategoria_ integer, scodbarra_ character varying, ndestino_ integer, simagen_ character varying, ntipo_ integer, nalmdescarga_ integer)
  RETURNS integer AS
$BODY$


DECLARE
	i bigint := nextval('seq_producto');
BEGIN
	
	INSERT INTO producto(ncodigo , sdescorta , sdeslarga , ncategoria , nestado , nprecio , scodbarra , ncodigodestino, simagen, ntipo, nalmdescarga)
	VALUES (i, sdescorta_, sdeslarga_ , ncategoria_, nestado_  , nprecio_ , scodbarra_ , ndestino_ , simagen_ , ntipo_ , nalmdescarga_);

	RETURN i;
END;

$BODY$
  LANGUAGE 'plpgsql' VOLATILE;



DROP FUNCTION proc_producto_lista_mantenimiento(ncodigo_ integer, sdescorta_ character varying, ncategoria_ integer);
DROP FUNCTION proc_producto_lista_estado(nestado integer);


DROP TYPE tp_producto_lista_estado;

CREATE TYPE tp_producto_lista_estado AS
   (ncodigo integer,
    sdescorta character varying(30),
    sdeslarga character varying(200),
    ncategoria integer,
    scategoria character varying(20),
    nestado integer,
    sestado character varying(20),
    nprecio double precision,
    scodbarra character varying(5),
    ntotalregistros integer,
    simagen character varying(300),
    ndestino integer,
    sdestino character varying(300),
    ntipo integer,
    sdescripcion character varying(50),
    nalmdescarga integer,
    sdesalmacen character varying(200));
ALTER TYPE tp_producto_lista_estado OWNER TO postgres;

DROP TYPE tp_producto_lista_mantenimiento;

CREATE TYPE tp_producto_lista_mantenimiento AS
   (ncodigo integer,
    sdescorta character varying(30),
    sdeslarga character varying(200),
    ncategoria integer,
    scategoria character varying(20),
    nestado integer,
    sestado character varying(20),
    nprecio double precision,
    scodbarra character varying(5),
    ntotalregistros integer,
    simagen character varying(300),
    ndestino integer,
    sdestino character varying(300),
    ntipo integer,
    sdescripcion character varying(50),
    nalmdescarga integer,
    sdesalmacen character varying(200));
ALTER TYPE tp_producto_lista_mantenimiento OWNER TO postgres;






CREATE OR REPLACE FUNCTION proc_producto_lista_estado(nestado integer)
  RETURNS SETOF tp_producto_lista_estado AS
$BODY$
	

	SELECT p.ncodigo, p.sdescorta, p.sdeslarga, p.ncategoria, c.sdescorta, p.nestado, e.sdescripcion,  nprecio, scodbarra, 1 , p.simagen, 
	ncodigodestino, d.sdescripcion, p.ntipo, t.sdescripcion, p.nalmdescarga, a.sdeslarga
	FROM producto p
	LEFT JOIN destino d
	ON d.ncodigo = p.ncodigodestino
	INNER JOIN estado e
	ON e.ncodigo= p.nestado
	INNER JOIN categoria c 
	ON c.ncodigo = p.ncategoria
	LEFT OUTER JOIN tipo t
	ON p.ntipo=t.ncodigo
        INNER JOIN almacen a
	ON p.nalmdescarga=a.ncodigo
	WHERE TRUE 	
	AND p.nestado  =  $1;

$BODY$
  LANGUAGE 'sql' VOLATILE;





CREATE OR REPLACE FUNCTION proc_producto_lista_mantenimiento(ncodigo_ integer, sdescorta_ character varying, ncategoria_ integer)
  RETURNS SETOF tp_producto_lista_mantenimiento AS
$BODY$
	DECLARE 
	reg tp_producto_lista_mantenimiento;
	sql 	text;

BEGIN
	

	sql='SELECT p.ncodigo, p.sdescorta, p.sdeslarga, p.ncategoria, c.sdescorta, p.nestado, e.sdescripcion,  nprecio, scodbarra, 1 , p.simagen, 
	p.ncodigodestino , d.sdescripcion , p.ntipo , t.sdescripcion, p.nalmdescarga, a.sdeslarga
	FROM producto p
	LEFT JOIN destino d
	ON d.ncodigo = p.ncodigodestino
	INNER JOIN estado e
	ON e.ncodigo= p.nestado
	INNER JOIN categoria c 
	ON c.ncodigo = p.ncategoria
	LEFT OUTER JOIN tipo t
	ON p.ntipo=t.ncodigo
	INNER JOIN almacen a
	ON p.nalmdescarga=a.ncodigo
	WHERE TRUE  ';

	IF ncodigo_ IS NOT NULL AND ncodigo_ !=0 THEN 
		sql=sql || ' AND p.ncodigo  = ' || ncodigo_;
	END IF;
	
	IF  sdescorta_ IS NOT NULL THEN 
		sql=sql || ' AND upper(p.sdescorta )  like ''%' ||  upper(sdescorta_) || '%''';
	END IF;

	IF ncategoria_ IS NOT NULL AND ncategoria_ !=0 THEN 
		sql=sql || ' AND p.ncategoria  = ' || ncategoria_;
	END IF;	

	sql = sql ||' ORDER BY p.ncodigo ';
	
	raise notice '%', sql;
	FOR reg in Execute (sql)
	LOOP
		return next reg;
	END LOOP;
END

$BODY$
  LANGUAGE 'plpgsql' VOLATILE;




